package xing.repository.page.custom;

import com.querydsl.core.Tuple;
import com.querydsl.core.types.Projections;
import com.querydsl.jpa.impl.JPAQuery;
import xing.domain.page.*;
import xing.domain.page.dto.ModuleItemDto;
import xing.repository.BaseRepository;

import java.util.Collections;
import java.util.List;

public class PageTemplateRepositoryImpl extends BaseRepository implements PageTemplateRepositoryCus {
    @Override
    public PageTemplate getTemplateDetail(long templateId) {
        QPageTemplate qTemplate=QPageTemplate.pageTemplate;
        QPageModule qModule=QPageModule.pageModule;
        QPageModuleItem qModuleItem=QPageModuleItem.pageModuleItem;
        QPageContentItem qContentItem=QPageContentItem.pageContentItem;

        JPAQuery<Tuple> jpaQuery=queryFactory.select(qTemplate,qModule,//qModuleItem,
                Projections.fields(ModuleItemDto.class, qModuleItem.id, qContentItem.id.as("contentid"), qModuleItem.moduleid, qModuleItem.sort,
                        qContentItem.title,qContentItem.imageurl,qContentItem.target,qContentItem.type,qModuleItem.reftype)
                )
                .where(qTemplate.id.eq(templateId))
                .from(qTemplate).leftJoin(qModule)
                .on(qTemplate.id.longValue().eq(qModule.templateid.longValue()))
                .from(qModule).leftJoin(qModuleItem)
                .on((qModule.id.longValue().eq(qModuleItem.moduleid.longValue())))
//                .on((qModule.refmoduleid.when(0L).then(qModule.id).otherwise(qModule.refmoduleid).longValue()
//                        .eq(qModuleItem.moduleid.longValue())))
                .from(qModuleItem).leftJoin(qContentItem)
                .on(qModuleItem.contentid.longValue().eq(qContentItem.id.longValue()))
                .orderBy(qModule.sort.asc())
                        ;

        List<Tuple> list= jpaQuery.fetch();

        //resolve data from query result
        PageTemplate template = list.size()>0?list.get(0).get(qTemplate):new PageTemplate();
        List<PageModule> modules=template.getModules();
        for(Tuple item:list){
            PageModule module=item.get(qModule);
            if(null== module) continue;
            //模块集合中有可能重复
            if(modules.stream().filter(i->i.getId().equals(module.getId())).count()==0)
                modules.add(module);
//            if(ContainerUtil.getItemById(modules,module.getId())==null)
//                modules.add(module);
            //添加模块内容
            ModuleItemDto moduleItem=item.get(2,ModuleItemDto.class);
            if(moduleItem.getId()!=null)
                module.getModuleItems().add(moduleItem);
        }
        //sort
        Collections.sort(template.getModules());
        template.getModules().forEach((item)->{
            Collections.sort(item.getModuleItems());
        });

        return template;
    }

    public List<Tuple> getGroupedTemplateCount(String cropId){
        QPageTemplate qTemplate=QPageTemplate.pageTemplate;
        List<Tuple> list=
        queryFactory.select(qTemplate.templatetype, qTemplate.count())
                .from(qTemplate)
                .where(qTemplate.companycode.eq(cropId).and(qTemplate.templatetype.gt(1)))
                .groupBy(qTemplate.templatetype)
                .fetch();

        return list;
    }
}
